package com.sywl.ytcx.util;

import com.sywl.ytcx.config.PathConfig;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.Random;

public class FileUtil {
    /**
     * IO工具
     **/

    /**
     * 储存文件
     *
     * @MultipartFile file 文件
     * @String path 存储路径
     */
    public static String storeFile(MultipartFile file, String path) throws IOException {
        String fileName;
        try {
            File dir = new File(path);
            if (!dir.exists()) dir.mkdirs();
            if (file == null) return "fileIsNull";
            //如果文件名包含有中文，会导致删除错误，那么我就给文件随机命名，但是他没有扩展名的话是写不进去的，要获取一下原来的类型
            String originalFilename = file.getOriginalFilename();
            if (originalFilename == null) return "fileIsNull";
            //获取文件格式，jpg加jpg，png加png
            file.getName();
            String[] split = originalFilename.split("/.");
            String extension = split[split.length - 1];
            Random random = new Random();
            fileName = java.lang.String.valueOf(System.currentTimeMillis()) + "_" + random.nextInt(1000000) + "." + extension;
//         为什么上传jpg的会变成jpeg呢
            File targetFile = new File(dir, fileName);
            file.transferTo(targetFile);
            return fileName;
            /*
             本方法返回文件名，不包括路径，需要和域名+接口url自做拼接，如果要拼接请嵌套调用
             String url = FileUtil.getFileUrl(FileUtil.storeFile(file,路径))
            */
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 获取文件url
     *
     * @param fileName 文件名
     * @param type     资源类型 这个其实是文件夹引导码，为了不暴露文件夹名
     * @return 文件url
     */
    public static String getFileUrl(String fileName, String type) {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append(PathConfig.DOMAIN_NAME);
        stringBuilder.append("/api/asset/");//访问接口
        stringBuilder.append(type);
        stringBuilder.append("/");
        stringBuilder.append(fileName);
        return stringBuilder.toString();
    }


    /**
     * url转文件路径
     */
    public static String urlToFilePath(String url) {
        String[] split = url.split("/");
        return PathConfig.FILE_PATH + split[split.length - 2] + "/" + split[split.length - 1];
    }


    /**
     * 检查文件是否存在
     *
     * @param fileName 文件名
     * @param type     资源类型 这个其实是文件夹引导码，为了不暴露文件夹名
     * @return boolean
     */
    public boolean checkFileExists(String fileName, String type) {
        File file = new File(PathConfig.FILE_PATH + type + "/" + fileName);
        return file.exists();
    }


    /**
     * 删除文件
     *
     * @param fileName 文件名
     * @param type     资源类型 这个其实是文件夹引导码，为了不暴露文件夹名
     */
    public void deleteFile(String fileName, String type) {
        File file = new File(PathConfig.FILE_PATH + type + "/" + fileName);
        if (file.exists()) {
            file.delete();
        }
    }


    /**
     * 获取文件MIME类型
     *
     * @param fileName 文件名
     * @return MIME类型
     */
    public static String getMimeType(String fileName) {
        String mimeType = "application/octet-stream"; // 默认 MIME 类型
        if (fileName.endsWith(".png")) {
            mimeType = "image/png";
        } else if (fileName.endsWith(".jpg")) {
            mimeType = "image/jpeg";
        } else if (fileName.endsWith(".gif")) {
            mimeType = "image/gif";
        } else if (fileName.endsWith(".webp")) {
            mimeType = "image/webp";
        } else if (fileName.endsWith(".pdf")) {
            mimeType = "application/pdf";
        } else if (fileName.endsWith(".jfif")) {
            mimeType = "image/jfif";
        } else if (fileName.endsWith(".svg")) {
            mimeType = "image/svg+xml";
        } else {
            return "NotImage";
            //该文件错了的话就删掉这个文件
            // if ("NotImage".equals(mimeType)) {
            //            file.delete(); // 这里删除文件可能不是一个好主意，因为它可能会影响其他正在进行的请求
            //            return ResponseEntity.notFound().build();
            //        }
        }

        return mimeType;
    }


}
